package common.model.Entity.courseEntity;

import common.constant.SchedulePeriod;
import common.model.Entity.BaseEntity;
import lombok.Getter;
import lombok.Setter;

/**
 * 表示课程的上课安排，包括上课时间、星期和地点。
 */
@Getter
@Setter
public class CourseSchedule extends BaseEntity {
    /** 所属课程ID */
    private Long courseId;

    /** 星期几，1=周一, ..., 7=周日 */
    private Integer dayOfWeek;

    /** 开始节次 */
    private Integer startTime;

    /** 结束节次 */
    private Integer endTime;

    /** 上课地点，格式一般为 "building roomNumber" */
    private String location;

    /** 无参构造函数 */
    public CourseSchedule(){}

    /**
     * 构造函数，指定课程ID、星期、起始节次、结束节次和地点
     * @param courseId 所属课程ID
     * @param dayOfWeek 星期几 (1-7)
     * @param startTime 开始节次
     * @param endTime 结束节次
     * @param location 上课地点
     */
    public CourseSchedule(Long courseId, Integer dayOfWeek, Integer startTime, Integer endTime, String location) {
        this.courseId = courseId;
        this.dayOfWeek = dayOfWeek;
        this.startTime = startTime;
        this.endTime = endTime;
        this.location = location;
    }

    /**
     * 构造函数，指定ID、课程ID、星期、起始节次、结束节次和地点
     * @param id 数据库ID
     * @param courseId 所属课程ID
     * @param dayOfWeek 星期几 (1-7)
     * @param startTime 开始节次
     * @param endTime 结束节次
     * @param location 上课地点
     */
    public CourseSchedule(Long id, Long courseId, Integer dayOfWeek, Integer startTime, Integer endTime, String location) {
        super(id);
        this.courseId = courseId;
        this.dayOfWeek = dayOfWeek;
        this.startTime = startTime;
        this.endTime = endTime;
        this.location = location;
    }

    /**
     * 获取该课程安排的节次范围
     * @return 一个 SchedulePeriod 数组，包含起始节次和结束节次；
     *         如果 startTime 或 endTime 为 null，或者无法解析为 SchedulePeriod，则返回 null
     */
    public SchedulePeriod[] getPeriodTimeRange() {
        if (startTime == null || endTime == null) {
            return null;
        }
        SchedulePeriod startPeriod = SchedulePeriod.getByPeriod(startTime);
        SchedulePeriod endPeriod = SchedulePeriod.getByPeriod(endTime);
        if (startPeriod == null || endPeriod == null) {
            return null;
        }
        SchedulePeriod[] ret = new SchedulePeriod[2];
        ret[0] = startPeriod;
        ret[1] = endPeriod;
        return ret;
    }
}
